home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / initramfs-tools / hook-functions next >
Text File  |  2009-10-09  |  11KB  |  452 lines

  1. # -*- shell-script -*-
  2.  
  3. catenate_cpiogz() {
  4.     # Sanity check
  5.     if [ ! -e "${1}" ]; then
  6.         echo "W:catenate_cpiogz: arg1='${1}' does not exist." >&2
  7.         return
  8.     fi
  9.  
  10.     cat "${1}" >>"${__TMPCPIOGZ}"
  11. }
  12.  
  13. force_load()
  14. {
  15.         manual_add_modules ${@}
  16.         echo "${@}" >>"${DESTDIR}/conf/modules"
  17. }
  18.  
  19. # Takes a file containing a list of modules to be added as an
  20. # argument, figures out dependancies, and adds them.
  21. #
  22. # Input file syntax:
  23. #
  24. #   # comment
  25. #   modprobe_module_name [args ...]
  26. #   [...]
  27. #
  28. add_modules_from_file()
  29. {
  30.     # Sanity check
  31.     if [ ! -e "${1}" ]; then
  32.         echo "W:add_modules_from_file: arg1='${1}' does not exist." >&2
  33.         return
  34.     fi
  35.  
  36.     sed -e '/^#/d' ${1} | while read module rest; do
  37.         force_load "${module}" "${rest}"
  38.     done
  39. }
  40.  
  41. # Is this module available?
  42. have_module()
  43. {
  44.     modprobe --set-version="${version}" --ignore-install \
  45.         --show-depends "${1}" >/dev/null 2>&1
  46. }
  47.  
  48. # Add dependent modules + eventual firmware
  49. manual_add_modules()
  50. {
  51.     local mam_x firmwares firmware
  52.  
  53.     for mam_x in $(modprobe --set-version="${version}" --ignore-install \
  54.     --show-depends "${1}" 2>/dev/null | awk '/^insmod/ { print $2 }'); do
  55.         # Prune duplicates
  56.         if [ -e "${DESTDIR}/${mam_x}" ]; then
  57.             continue
  58.         fi
  59.  
  60.         mkdir -p "${DESTDIR}/$(dirname "${mam_x}")"
  61.         ln -s "${mam_x}" "${DESTDIR}/$(dirname "${mam_x}")"
  62.         if [ "${verbose}" = "y" ]; then
  63.             echo "Adding module ${mam_x}"
  64.         fi
  65.  
  66.         # Add firmware files if necessary
  67.         firmwares=$(modinfo -F firmware "${mam_x}")
  68.         if [ -z "${firmwares}" ]; then
  69.             continue
  70.         fi
  71.         for firmware in $firmwares; do
  72.             if [ -e "${DESTDIR}/lib/firmware/${version}/${firmware}" ]; then
  73.                 continue
  74.             fi
  75.  
  76.             # Only print warning for missing fw of loaded module
  77.             # or forced loaded module
  78.             if [ ! -e "/lib/firmware/${version}/${firmware}" ]; then
  79.                 if grep -q "^$(basename "${mam_x}" .ko)" \
  80.                 /proc/modules \
  81.                 || grep -q "^$(basename "${mam_x}" .ko)" \
  82.                 "${CONFDIR}/modules"; then
  83.                     echo "W: Possible missing firmware /lib/firmware/${version}/${firmware} for module $(basename ${mam_x} .ko)" >&2
  84.                 fi
  85.                 continue
  86.             fi
  87.  
  88.             copy_exec "/lib/firmware/${version}/${firmware}"
  89.             if [ "${verbose}" = "y" ]; then
  90.                 echo "Adding firmware ${firmware}"
  91.             fi
  92.         done
  93.     done
  94. }
  95.  
  96. # $1 is the source path (e.g. /usr/bin/time)
  97. # $2 is the relative destination (e.g. /usr or /usr/time)
  98. #
  99. # The destination is interpreted in the same way "cp" would, meaning
  100. # (assuming /bin is a directory):
  101. #
  102. #   "copy_exec /usr/bin/time /bin"        -> /bin/time
  103. #   "copy_exec /usr/bin/time /bin/mytime" -> /bin/mytime
  104. # If $2 is left out, the same destination path as for the source arg will
  105. # be used and directories will be created as needed, so:
  106. #
  107. #   "copy_exec /usr/bin/time"             -> /usr/bin/time
  108. #
  109. copy_exec() {
  110.     local source target destination final_destination x nonoptlib
  111.     local libname dirname
  112.  
  113.     source="${1}"
  114.     if [ -n "${2}" ]; then
  115.         target="${2}"
  116.     else
  117.         if [ ! -e "${DESTDIR}/$(dirname "${1}")" ]; then
  118.             mkdir -p "${DESTDIR}/$(dirname "${1}")"
  119.         fi
  120.         target="${1}"
  121.     fi
  122.  
  123.     if [ -d "${DESTDIR}/${target}" ]; then
  124.         destination="${target}/$(basename "${source}")"
  125.     else
  126.         destination="${target}"
  127.     fi
  128.     final_destination="${DESTDIR}/${destination}"
  129.  
  130.     if [ -L "$final_destination" ]; then
  131.         if [ $(readlink "${final_destination}") != "${source}" ]; then
  132.             echo "W:copy_exec: Not copying ${source} to \$DESTDIR${destination}, which is already a copy of $(readlink ${final_destination})" >&2
  133.             return
  134.         fi
  135.     else
  136.         ln -s ${source} ${DESTDIR}/${destination}
  137.         if [ "${verbose}" = "y" ]; then
  138.             echo "Adding binary ${source}"
  139.         fi
  140.     fi
  141.  
  142.     # Copy the dependant libraries
  143.     for x in $(ldd ${source} 2>/dev/null | sed -e '
  144.         /\//!d;
  145.         /linux-gate/d;
  146.         /=>/ {s/.*=>[[:blank:]]*\([^[:blank:]]*\).*/\1/};
  147.         s/[[:blank:]]*\([^[:blank:]]*\) (.*)/\1/' 2>/dev/null); do
  148.  
  149.         # Try to use non-optimised libraries where possible.
  150.         # We assume that all HWCAP libraries will be in tls,
  151.         # sse2, vfp or neon
  152.         nonoptlib=$(echo "${x}" | sed -e 's#/lib/\(tls\|i686\|sse2\|neon\|vfp\).*/\(lib.*\)#/lib/\2#')
  153.  
  154.         if [ -e "${nonoptlib}" ]; then
  155.             x="${nonoptlib}"
  156.         fi
  157.  
  158.         libname=$(basename "${x}")
  159.         dirname=$(dirname "${x}")
  160.  
  161.         mkdir -p "${DESTDIR}/${dirname}"
  162.         if [ ! -e "${DESTDIR}/${dirname}/${libname}" ]; then
  163.             ln -s "${x}" "${DESTDIR}/${dirname}"
  164.             if [ "${verbose}" = "y" ]; then
  165.                 echo "Adding library ${x}"
  166.             fi
  167.         fi
  168.     done
  169. }
  170.  
  171. # Copy entire subtrees to the initramfs
  172. copy_modules_dir()
  173. {
  174.     local x_mod
  175.  
  176.     if ! [ -d "${MODULESDIR}/${1}" ]; then
  177.         return;
  178.     fi
  179.     if [ "${verbose}" = "y" ]; then
  180.         echo "Copying module directory ${1}"
  181.     fi
  182.     for x_mod in $(find "${MODULESDIR}/${1}" -name '*.ko' -print); do
  183.         manual_add_modules $(basename ${x_mod} .ko)
  184.     done
  185. }
  186.  
  187. # walk /sys for relevant modules
  188. sys_walk_mod_add()
  189. {
  190.     local driver_path module
  191.     device_path="$1"
  192.     
  193.     while [ "${device_path}" != "/sys" ]; do
  194.         driver_path="$(readlink -f ${device_path}/driver)"
  195.         if [ -e "$driver_path" ]; then
  196.             module="$(basename $(readlink -f $driver_path))"
  197.             if [ -n "${module}" ]; then
  198.                 force_load "${module}"
  199.             fi
  200.         fi
  201.         device_path="$(dirname ${device_path})"
  202.     done
  203. }
  204.  
  205. # walk /sys for relevant modalias
  206. sys_walk_modalias()
  207. {
  208.     local device_path modalias
  209.  
  210.     device_path="$(dirname "${1}")"
  211.     device_path="$(dirname "${device_path}")"
  212.     if [ -e "${device_path}/modalias" ]; then
  213.         modalias=$(cat "${device_path}/modalias")
  214.     fi
  215.  
  216.     if [ -n "${modalias}" ]; then
  217.         force_load "${modalias}"
  218.     fi
  219. }
  220.  
  221. # find and only copy root relevant modules
  222. dep_add_modules()
  223. {
  224.     local block minor root FSTYPE root_dev_path x
  225.  
  226.     # findout root block device + fstype
  227.     eval "$(mount | awk '/\/dev\// {if ($3 == "/") {print "root=" $1 "\nFSTYPE=" $5; exit}}')"
  228.     if [ "${root}" = "/dev/root" ] ; then
  229.         root="/dev/disk/by-uuid/"$(/sbin/blkid -s UUID -o value ${root}) 2>/dev/null
  230.     fi
  231.     root="$(readlink -f ${root})"
  232.  
  233.     # find out real rootfs on auto type
  234.     if [ "${FSTYPE}" = "auto" ]; then
  235.         eval "$(/usr/lib/klibc/bin/fstype ${root})"
  236.     fi
  237.  
  238.     # check that fstype rootfs recognition
  239.     if [ "${FSTYPE}" = "unknown" ]; then
  240.         echo "mkinitramfs: unknown fstype on root ${root}"
  241.         echo "mkinitramfs: workaround is MODULES=most" 
  242.         echo "mkinitramfs: Error please report bug on initramfs-tools" 
  243.         exit 1
  244.     fi
  245.  
  246.     # Add rootfs
  247.     manual_add_modules "${FSTYPE}"
  248.  
  249.     # lvm luks root
  250.     if [ "${root#/dev/mapper/}" != "${root}" ]; then
  251.         minor=$((0x$(stat --format "%T" ${root}) % 256))
  252.         block=$(ls -1 /sys/block/dm-${minor}/slaves | head -n 1)
  253.         if [ "${block#dm-}" != "${block}" ]; then
  254.             block=$(ls -1 /sys/block/${block}/slaves | head -n 1)
  255.         fi
  256.         block=${block%[0-9]*}
  257.     # md root new naming scheme /dev/md/X
  258.     elif [ "${root#/dev/md/}" != "${root}" ]; then
  259.         root=${root#/dev/md/}
  260.         block=$(awk "/^md${root}/{print substr(\$5, 1, 3); exit}" \
  261.             /proc/mdstat)
  262.     # md root /dev/mdX
  263.     elif [ "${root#/dev/md}" != "${root}" ]; then
  264.         root=${root#/dev/}
  265.         block=$(awk "/^${root}/{print substr(\$5, 1, 3); exit}" \
  266.             /proc/mdstat)
  267.     # classical root device
  268.     else
  269.         block=${root#/dev/}
  270.         block=${block%[0-9]*}
  271.     fi
  272.  
  273.     # Error out if /sys lack block dev
  274.     if [ -z "${block}" ] || [ ! -e /sys/block/${block} ]; then
  275.         echo "mkinitramfs: missing ${block} root ${root} /sys entry"
  276.         echo "mkinitramfs: workaround is MODULES=most" 
  277.         echo "mkinitramfs: Error please report the bug" 
  278.         exit 1
  279.     fi
  280.  
  281.     # sys walk ATA
  282.     root_dev_path=$(readlink -f /sys/block/${block}/device)
  283.     sys_walk_mod_add ${root_dev_path}
  284.  
  285.     # catch old-style IDE
  286.     if [ -e /sys/bus/ide/devices/ ]; then
  287.         sys_walk_modalias ${root_dev_path}
  288.         manual_add_modules ide-disk
  289.         manual_add_modules ide-cd
  290.     fi
  291.  
  292.     if [ -e /sys/bus/scsi/devices/ ]; then
  293.         manual_add_modules sd_mod
  294.     fi
  295.  
  296.     if [ -e /sys/bus/i2o/devices/ ]; then
  297.         force_load i2o_block
  298.         force_load i2o_config
  299.     fi
  300.  
  301.     if [ -e /sys/bus/ps3_system_bus/ ]; then
  302.         for x in ps3disk ps3rom ps3-gelic ps3_sys_manager; do
  303.             manual_add_modules "${x}"
  304.         done
  305.     fi
  306.  
  307.     if [ -e /sys/bus/vio/ ]; then
  308.         for x in sunvnet sunvdc; do
  309.             manual_add_modules "${x}"
  310.         done
  311.     fi
  312. }
  313.  
  314.  
  315. # The modules "most" classes added per default to the initramfs
  316. auto_add_modules()
  317. {
  318.     case "$1" in
  319.     base)
  320.         for x in ehci-hcd ohci-hcd uhci-hcd usbhid hid_a4tech \
  321.         hid_apple hid_belkin hid_bright hid_cherry hid_chicony \
  322.         hid_cypress hid_dell hid_ezkey hid_gyration hid_logitech \
  323.         hid_microsoft hid_monterey hid_petalynx hid_pl     hid_samsung \
  324.         hid_sony hid_sunplus hid_tmff hid_zpff usb-storage ext2 \
  325.         ext3 ext4 isofs jfs nfs reiserfs udf xfs af_packet atkbd i8042 \
  326.         virtio_pci vfat nls_cp437 nls_iso8859-1; do
  327.             manual_add_modules "${x}"
  328.         done
  329.     ;;
  330.     net)
  331.         for x in 3c59x 8139cp 8139too 8390 atl1 atl1e b44 bmac \
  332.         cxgb3 defxx dl2k e100 e1000 e1000e ehea epic100 \
  333.         ep93xx_eth eql fealnx famachi forcedeth gelic_net \
  334.         hp100 igb ipg mace mv643xx_eth myri10ge \
  335.         natsemi ne2k-pci netconsole niu ns83820 pcnet32 qla3xxx \
  336.         r8169 s2io sis900 skge sky2 slhc smc911x starfire \
  337.         sundance sungem sungem_phy sunhme sunvnet tg3 tlan de2104x \
  338.         de4x5 dmfe tulip winbond-840 xircom_cb xircom_tulip_cb \
  339.         typhon via-rhine via-velocity virtio_net yellowfin; do
  340.             manual_add_modules "${x}"
  341.         done
  342.     ;;
  343.     ide)
  344.         copy_modules_dir kernel/drivers/ide
  345.     ;;
  346.     scsi)
  347.         copy_modules_dir kernel/drivers/scsi
  348.         for x in mptfc mptsas mptscsih mptspi; do
  349.             manual_add_modules "${x}"
  350.         done
  351.     ;;
  352.     ata)
  353.         copy_modules_dir kernel/drivers/ata
  354.     ;;
  355.     block)
  356.         copy_modules_dir kernel/drivers/block
  357.         copy_modules_dir kernel/drivers/usb/storage
  358.     ;;
  359.     # FIXME: can be removed after Lenny release
  360.     ieee1394)
  361.         for x in ohci1394 sbp2; do
  362.             manual_add_modules "${x}"
  363.         done
  364.     ;;
  365.     firewire)
  366.         for x in firewire-ohci  firewire-sbp2; do
  367.             manual_add_modules "${x}"
  368.         done
  369.     ;;
  370.     i2o)
  371.         for x in i2o_block; do
  372.             manual_add_modules "${x}"
  373.         done
  374.     ;;
  375.     dasd)
  376.         for x in dasd_eckd_mod dasd_fba_mod; do
  377.             manual_add_modules "${x}"
  378.         done
  379.     ;;
  380.     *)
  381.         auto_add_modules base
  382.         auto_add_modules net
  383.         auto_add_modules ide
  384.         auto_add_modules scsi
  385.         auto_add_modules block
  386.         auto_add_modules ata
  387.         auto_add_modules i2o
  388.         auto_add_modules dasd
  389.         auto_add_modules ieee1394
  390.         auto_add_modules firewire
  391.     ;;
  392.     esac
  393. }
  394.  
  395. usage()
  396. {
  397.     cat >&2 << EOF
  398.  
  399. Usage: ${0} [OPTION]... <-o outfile> [version]
  400.  
  401. Options:
  402.   -d confdir  Specify an alternative configuration directory.
  403.   -k          Keep temporary directory used to make the image.
  404.   -o outfile  Write to outfile.
  405.   -r root     Override ROOT setting in mkinitrd.conf.
  406.  
  407. See mkinitramfs(8) for further details.
  408. EOF
  409.     exit 1
  410.  
  411. }
  412.  
  413. # minimal supported kernel version
  414. check_minkver()
  415. {
  416.     local curversion initdir DPKG_ARCH minversion cm_x tmp
  417.  
  418.     curversion="${1}"
  419.     initdir="${2}"
  420.     if [ -z "${initdir}" ]; then
  421.         DPKG_ARCH=$(dpkg --print-architecture)
  422.         case ${DPKG_ARCH} in
  423.             ia64|hppa)
  424.                 minversion="2.6.15"
  425.             ;;
  426.             *)
  427.                 minversion="2.6.12"
  428.             ;;
  429.         esac
  430.         if dpkg --compare-versions "${curversion}" lt "${minversion}"; then
  431.             echo "W: kernel ${curversion} too old for initramfs on ${DPKG_ARCH}" >&2
  432.             echo "W: not generating requested initramfs for kernel ${curversion}" >&2
  433.             exit 2
  434.         fi
  435.         return 0
  436.     fi
  437.     set_initlist
  438.     for cm_x in ${initlist}; do
  439.         # sed: keep last line starting with MINKVER=,
  440.         #      remove MINKVER= and trailing space
  441.         minver=$(sed '/^MINKVER=/!d;$!d;s/^MINKVER=//;s/[[:space:]]*$//' "${initdir}/${cm_x}")
  442.         if [ -z "${tmp}" ]; then
  443.             continue
  444.         elif dpkg --compare-versions "${curversion}" lt "${minver}"; then
  445.             echo "W: ${cm_x} hook script requires at least kernel version ${minver}" >&2
  446.             echo "W: not generating requested initramfs for kernel ${curversion}" >&2
  447.             exit 2
  448.         fi
  449.     done
  450. }
  451.